/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package futbol.tacticas.concursantes.aitkiar.aitutil;

import futbol.tacticas.Comando;
import futbol.tacticas.ComandoGolpearBola;
import futbol.tacticas.ComandoIrA;
import futbol.tacticas.ComandoTiroAPuerta;
import futbol.tacticas.SituacionJugadores;
import java.awt.Point;

/**
 *
 * @author aitkiar
 */
public class Medio extends Jugador
{
    protected int zonaDeMarca = -20;

    public Medio( int x, int y, int fuerza, int numero )
    {
        super( x, y, fuerza, numero );
    }
    
    @Override
    public Comando getComando( SituacionJugadores sj )
    {
        Point bola;
        Comando comando;
        Point destino = Utils.posicionTrayectoriaBola(sj);
        Point misJugadores[] = sj.getMisJugadores();
        Point contrarioMasCercano = campo.getMarcaje( numero );
        bola = sj.getBola();
        
        posicion = misJugadores[numero];
        if ( Utils.disparo( posicion, sj ) )
        {
            // Calcula si el jugador dispara o pasa
            if ( posicion.x + Utils.getDistanciaDisparo( fuerza ) + 14 > 160 )
            {
                comando = new ComandoTiroAPuerta( numero,  mejorDisparo( sj ));
            }
            else
            {
                Point pase = getPase( sj );
                comando = new ComandoGolpearBola( numero, pase.x, pase.y );
                equipo[sj.getMiJugadorMasCerca(pase.x, pase.y)].notificaPase( fuerza, pase );
            }
        }
        else if ( campo.getJugadorMasCercanoBola() == numero  )
        {
            // Si es el jugador más cercano al destino de la bola va a por ella.
            comando = new ComandoIrA( this.numero, destino.getX(), destino.getY() );
            notificacionPase = 0;
            puntoPase = null;            
        }
        else if ( notificacionPase > 0 && puntoPase != null )
        {
            notificacionPase --;
            comando = new ComandoIrA( this.numero, puntoPase.getX(), puntoPase.getY() );
        }
        else if ( defensivo && bola.x < zonaDeMarca && contrarioMasCercano != null )
        {
            comando = new ComandoIrA( this.numero, contrarioMasCercano.x + 5, contrarioMasCercano.y );
            notificacionPase = 0;
            puntoPase = null;
        }
        else if ( bola.x > zonaDeMarca || ( Math.abs( bola.x - posicion.x ) < 40 && Utils.ultimaBola != null && Utils.ultimaBola.x < bola.x )  )
        {
            Point desmarque = getMejorDesmarque( sj );
            if ( desmarque == null )
            {
                desmarque = new Point( x, y );
            }
            comando = new ComandoIrA( this.numero, desmarque.x, desmarque.y );
            notificacionPase = 0;
            puntoPase = null;
        }
        else
        {
            comando = new ComandoIrA( this.numero, x, y );
            notificacionPase = 0;
            puntoPase = null;
        }
        return comando;
    }
    
    public int heuristicaDesmarqueClase( SituacionJugadores sj, ZonaCampo zona )
    {
        int heuristica = 0;
        double distanciaBola = Utils.distancia( zona.pase, sj.getBola());
        
        heuristica -= distanciaBola;
        heuristica -= Math.abs( zona.pase.y - y );
        
        if ( defensivo )
        {
            if ( Utils.distancia( new Point( x, y ), zona.pase ) > 30 )
            {
                heuristica -= Utils.distancia( new Point( x, y ), zona.pase );
            }
            if ( sj.getBola().x < posicion.x )
            {
                heuristica += posicion.x - zona.pase.x;
            }
        }
        
        return heuristica;
    }

    /** En los medios favorecemos los pases al área cuando sobrepasan la posicion 120.
     * 
     * @param sj
     * @param zona
     * @return
     */
    @Override
    public int heuristicaPaseClase( SituacionJugadores sj, ZonaCampo zona )
    {
        int heuristica = 0;
        
        if ( posicion. x > 105 )
        {
            heuristica -= Utils.distancia( zona.pase, new Point( 145, 0 ));
        }
        
        return heuristica;
    }
    
   /** Si estamos antes de la zona de pase al área, pasamos normalmente. Si estamos cerca del área, hacemos un centro
    * con toda la fuerza en la línea del delantero más cercano.
     */
    @Override
    protected Point getPase( SituacionJugadores sj )
    {        
        if ( posicion.x > 110 )
        {
            Point posicionDelantero = sj.getMisJugadores()[ 10 ];
            Point posicionDelantero2 = sj.getMisJugadores()[6];
            
            Point delantero = posicionDelantero;
            if ( Utils.distancia( posicion, posicionDelantero ) > Utils.distancia( posicion, posicionDelantero2 ))
            {
                delantero = posicionDelantero2;
            }
            
            int x;
            int y;
            
            x = ( int )(( delantero.x - posicion.x ) / Utils.distancia( posicion, delantero ) * 35 + posicion.x);
            y = ( int )(( delantero.y - posicion.y ) / Utils.distancia( posicion, delantero ) * 35 + posicion.y);
            return new Point( x, y );
        }
        return super.getPase( sj );
    }
}
